import re
import jieba

# -------------------------- 1. 初始化配置 --------------------------
# 加载自定义词典（招聘领域词）
import os
dict_path = os.path.join(os.path.dirname(__file__), "boss_zhipin_dict.txt")
if os.path.exists(dict_path):
    jieba.load_userdict(dict_path)
else:
    print(f"警告: 词典文件不存在: {dict_path}")

# 敏感词库（文本+正则）
text_sensitive_words = {
    "abuse": {"垃圾", "坑", "蠢货", "傻", "恶心", "脑残"},
    "ad": {"加微信", "微信", "加QQ", "QQ", "代投", "收费", "链接", "私信"},
    "illegal": {"虚假招聘", "传销", "不签合同", "偷税", "漏税"},
    "irrelevant": {"股票", "借钱", "八卦", "追剧", "游戏"}
}
pattern_sensitive = {
    "phone": re.compile(r"1[3-9]\d{9}"),
    "qq": re.compile(r"[1-9]\d{4,10}"),
    "wechat": re.compile(r"wxid_\w+|wechat:\w+")
}

# Boss直聘提示词模板
prompt_template = """### 角色定位
你是Boss直聘平台的专业智能招聘顾问，精通企业招聘流程、求职者求职技巧、平台功能规则及人力资源基础常识，需以“解决用户实际招聘/求职问题”为核心，提供实用、准确、易懂的回答。

### 核心任务
1. 接收用户在Boss直聘平台的提问（用户身份可能是企业HR或求职者），先判断用户身份及问题场景，再针对性解答；
2. 若用户问题涉及平台功能（如“如何发布职位”“怎么查看简历联系方式”），需按平台最新规则（以企业/求职者端实际操作路径为准）分步说明；
3. 若用户问题涉及招聘技巧（如“HR如何筛选销售简历”“求职者怎么写简历亮点”），需提供可落地的方法，避免空泛建议；
4. 若用户问题涉及政策/法规（如“试用期工资标准”“劳动合同签订要求”），需明确标注“内容仅供参考，具体以当地劳动部门规定为准”，避免法律风险。

### 场景规则
- 拒绝回答与Boss直聘招聘场景无关的问题（如生活常识、娱乐八卦等），若用户提问偏离，需礼貌引导：“抱歉，目前仅能解答Boss直聘平台相关的招聘/求职问题，你可以说说具体的招聘需求或求职疑问哦～”；
- 回答需简洁聚焦，避免冗余：HR类问题侧重“效率/合规”，求职者类问题侧重“实用/落地”；
- 若用户问题模糊（如“怎么找工作”），需先追问关键信息：“为了更精准帮你，想了解你目前的求职方向（如行业/岗位），或是否在Boss直聘遇到了具体操作问题呀？”

### 输出要求
1. 语言风格：口语化但专业，避免生硬术语（如解释“五险一金”时，可补充“即养老保险、医疗保险、失业保险、工伤保险、生育保险及住房公积金”）；
2. 结构清晰：复杂问题（如操作类）用“步骤”呈现，多维度问题（如简历优化）用“要点”拆分；
3. 优先级：先给结论/核心方法，再补充细节，确保用户快速获取关键信息。

### 用户当前问题
{user_input}
"""


# -------------------------- 2. 核心处理函数 --------------------------
def preprocess_text(user_input):
    """文本预处理
    这段代码的功能是文本预处理：
    使用正则表达式删除用户输入中的特殊字符（*#@~）、空格、换行符和制表符
    将中文标点符号（逗号、句号、问号、感叹号）替换为对应的英文标点符号
    去除处理后文本前后的空白字符并返回结果
    """
    clean_text = re.sub(r"[*#@~ \n\t]", "", user_input)
    punc_map = {"，": ",", "。": ".", "？": "?", "！": "!"}
    for cn_punc, en_punc in punc_map.items():
        clean_text = clean_text.replace(cn_punc, en_punc)
    return clean_text.strip()


def jieba_cut(clean_text):
    """Jieba分词+去停用词"""
    words = jieba.lcut(clean_text, cut_all=False)
    stop_words = {"的", "怎么", "呢", "吗", "我", "你", "在", "是", "了", "要", "能"}

    # 使用传统for循环替代列表推导式
    filtered_words = []
    for word in words:
        # 如果词不在停用词集合中且长度大于等于1，则保留
        if word not in stop_words and len(word) >= 1:
            filtered_words.append(word)
    return filtered_words


def check_sensitive(core_words, clean_text):
    """敏感信息检测"""
    sensitive_result = {"is_sensitive": False, "sensitive_type": [], "reason": ""}
    # 文本敏感词匹配
    # 遍历核心词汇，检查是否包含敏感词
    for word in core_words:
        # 遍历敏感词类型及其对应的敏感词列表
        for sens_type, sens_words in text_sensitive_words.items():
            # 如果当前核心词在敏感词列表中，且该敏感词类型尚未记录到结果中
            if word in sens_words and sens_type not in sensitive_result["sensitive_type"]:
                # 标记文本为敏感文本
                sensitive_result["is_sensitive"] = True
                # 记录敏感词类型
                sensitive_result["sensitive_type"].append(sens_type)
    # 格式敏感词匹配
    # 遍历敏感词模式字典，检查文本中是否包含敏感内容
    # 当发现敏感内容时，更新敏感检测结果
    for sens_type, pattern in pattern_sensitive.items():
        if pattern.search(clean_text):
            sensitive_result["is_sensitive"] = True
            sensitive_result["sensitive_type"].append(sens_type)
    # 生成原因
    # 如果检测结果为敏感内容，则构建敏感类型映射并生成敏感原因说明
    # 通过类型映射表将英文敏感类型转换为中文描述，并拼接成完整的敏感原因文本
    if sensitive_result["is_sensitive"]:
        type_map = {
            "abuse": "不文明用语", "ad": "广告引流内容", "illegal": "违法违规内容",
            "irrelevant": "与招聘无关内容", "phone": "手机号", "qq": "QQ号", "wechat": "微信号"
        }
        # 将检测到的敏感类型从英文映射为中文描述
        hit_types = [type_map[t] for t in sensitive_result["sensitive_type"]]
        # 构造敏感原因说明文本
        sensitive_result["reason"] = f"内容包含{','.join(hit_types)}"

    return sensitive_result


def process_user_input(user_input):
    """完整处理流程：预处理→分词→敏感检测→生成提示词/拦截"""
    # 1. 预处理
    clean_text = preprocess_text(user_input)
    if not clean_text:
        return {"status": "fail", "msg": "请输入有效的招聘/求职相关问题哦～"}
    # 2. 分词
    core_words = jieba_cut(clean_text)
    # 3. 敏感检测
    sensitive_res = check_sensitive(core_words, clean_text)
    if sensitive_res["is_sensitive"]:
        return {
            "status": "block",
            "msg": f"抱歉，你的问题{sensitive_res['reason']}，不符合平台规则，请修改后重新提问（仅支持Boss直聘招聘/求职相关问题）～"
        }
    # 4. 生成合规提示词
    final_prompt = prompt_template.format(user_input=clean_text)
    return {"status": "success", "final_prompt": final_prompt}


# -------------------------- 3. 测试调用 --------------------------
if __name__ == "__main__":
    # 测试1：含敏感信息（广告+手机号）
    user_input1 = "HR怎么筛简历？加微信138XXXX1234聊"
    print(process_user_input(user_input1))
    # 输出：{"status":"block","msg":"抱歉，你的问题内容包含广告引流内容,手机号，不符合平台规则，请修改后重新提问（仅支持Boss直聘招聘/求职相关问题）～"}

    # 测试2：合规问题
    user_input2 = "HR怎么批量下载简历"
    res2 = process_user_input(user_input2)
    print(res2["status"])  # 输出：success
    print(res2["final_prompt"])  # 输出包含用户问题的完整提示词
